Оператор [frozen]

картинка

Назначение

В системах с циклической обработкой правил каждый логический узел перевычисляется на каждой итерации. Оператор [frozen] позволяет зафиксировать значение узла на заданный промежуток времени, предотвращая его пересчёт.

Как это работает

При использовании [frozen] значение узла "замораживается" — остаётся неизменным в течение указанного количества секунд, независимо от того, сколько итераций обработки правил происходит за это время.

Основные сценарии использования

  • Временное хранение значений — сохранение результата вычислений на нужный период;
  • Защита "медленных" операций — предотвращение повторных вызовов длительных процессов (отправка SMS, HTTP-запросы, работа с файловой системой).

Пример: отправка SMS с интервалом

В приведённом ниже правиле узел отправляет SMS-сообщение и затем "замораживается" на 30 секунд, что исключает повторную отправку до истечения этого времени:

-- Узел "N1_send_sms"
--------------------------------------
-- Отправить SMS-сообщение
N1_send_sms = {                                 -- Создаём логический узел "N1_send_sms"
    {
        ["load-ubus"] = function (nodes)        -- Оператор [load-ubus] через системную шину 
            return {                            -- вызывает метод отправки SMS 
                object = "tsmodem.sms",        	
                method = "send_sms", 
                params = {                      -- Результат:      
                    phone = "+79051234567",     -- {
                    text = "текст смс-сообщения" --    "status": "started",
                },                              -- }
            }
        end,
    },
    {
        ["frozen"] = function(nodes)            -- В оператор [frozen] возвращается
            return 30                           -- время "заморозки" узла для того,
        end                                     -- чтобы на следующих итерациях узел не выполнял
    }                                           -- по-новой запрос на отправку SMS.
},

Рекомендации

Размещайте [frozen] последним в списке операторов узла. Это гарантирует, что все предшествующие операции (получение данных, преобразования, проверки) успеют выполниться до момента заморозки.